;(function(){
  'use strict';
  angular.module('services.omdisplay.busAssessment')
    .factory('UpayAssessServer',upayAssessServer)
    .factory('UpayASelector',upayASelector)
    .factory('UpayAQueryObj',upayAQueryObj)
    .factory('UpayAViewObj',upayAViewObj);
  /**
   * [upayAssessServer description]
   * @param   Restangular
   */
  function upayAssessServer(Restangular){
    return{
      upayAssess:upayAssess
    };
    /**
     * 统一支付考核
     * @param    param     查询参数
     * @param    callback  回调函数
     * @return             promise对象
     */
    function upayAssess(param,callback){
      return Restangular.all('sas/OMdisplay/assessment/upayTradeQuery').post(param).then(callback);
    }
  }

  upayAssessServer.$inject = ['Restangular'];
  /**
   * 统一支付考核下拉选项集service
   * @param   COREDATA  公共数据service
   * @return            service实例
   */
  function upayASelector(COREDATA){
    var selector = {};
    return{
      initSelector : initSelector,
      getSelector : getSelector
    };
    //初始化并获取下拉菜单集
    function initSelector(){
      selector = {
        timeType :COREDATA.TIMETYPES
      };
      return selector;
    }
    //获取下拉菜单
    function getSelector(){
      return selector;
    }
  }

  upayASelector.$inject = ['COREDATA'];

  /**
   * 统一支付查询相关service
   * @param   BusAssessmentService 业务侧考核service
   * @param   CoreService          公共方法service
   * @param   UpayASelector        下拉选项集
   * @param   UpayAssessServer     查询请求service
   * @param   UpayAViewObj         页面展示数据service
   * @return                       service实例
   */
  function upayAQueryObj(BusAssessmentService,CoreLoading,CoreService,UpayASelector,UpayAssessServer,UpayAViewObj,PublicFn){
    //查询参数
    var param = {};
    //日期参数
    var date = {};
    //导出参数
    var exportParam = {};
    //页面控制标志
    var flag = {};
    return {
      initQueryParam : initQueryParam,
      initDateParam : initDateParam,
      initFlag : initFlag,
      setQueryParam : setQueryParam,
      upayAssessQueryFn : upayAssessQueryFn
    };
    //初始化查询参数
    function initQueryParam(){
      param = {
        quarter:{}
      };
      return param;
    }
    //统一支付考核查询方法
    function upayAssessQueryFn(){
      var tempParam = {};
      //查询表单为展开时,点击按钮进行查询
      if(!flag.formIsFold){
        //根据查询参数生成临时参数
        tempParam = setQueryParam();
        //载入动画
        CoreLoading.setState(true);
        //发送请求
        UpayAssessServer.upayAssess(tempParam,function(res){
        //当状态码为10000同时检查数据可用时,继续向下执行,否则弹窗提示结束执行
        if(res.state !== '10000' || checkData(res.data)){
            flag.showTable = false;
            //关闭载入动画
            CoreLoading.setState(false);
            //弹出提示
            CoreService.dialog(res.state);
            return;
          }
          flag.title = PublicFn.fmtDateTitle(tempParam,'timeType')+'考核区间内统一支付考核得分';
          //设置页面展示数据
          UpayAViewObj.setSeries(res.data);
          //设置展示账期区间
          UpayAViewObj.setDuration(tempParam);
          //设置导出参数
          UpayAViewObj.setExportParam(tempParam);
          //关闭载入动画
          CoreLoading.setState(false);
          //切换查询表单收拢状态
          flag.formIsFold = !flag.formIsFold;
          //显示列表
          flag.showTable = true;
        });
      }else{
        //切换查询表单收拢状态
        flag.formIsFold = !flag.formIsFold;
      }
    }

    //设置查询参数用来发送请求
    function setQueryParam(){
      //临时查询参数
      var tempParam = {};
      //日期格式
      var format = '';
      //下拉选项集
      var selector = UpayASelector.getSelector();
      //给临时查询参数账期赋值
      tempParam.timeType = param.timeType ? param.timeType.timeTypeCode : selector.timeType[0].timeTypeCode;
      //根据账期获取相应日期格式
      format = BusAssessmentService.FORMATARRAY[tempParam.timeType];
      //根据账期对日期参数进行相应处理
      if(param.timeType){
        switch(param.timeType.timeTypeCode){
          //季度
          case '4':
            tempParam.startTime = param.quarter.startTime.substr(0,4)+'-01-01';
            tempParam.endTime = param.quarter.endTime.substr(0,4)+'-01-01';
            tempParam.startQuarter = param.quarter.startTime.substr(4,1);
            tempParam.endQuarter = param.quarter.endTime.substr(4,1);
            break;
          //年
          case '5':
            tempParam.startTime = date.startTime+'-01-01';
            tempParam.endTime = date.endTime+'-01-01';
            break;
          //日月处理通用,仅仅format格式不同
          default :
            tempParam.startTime = CoreService.dateFormat(date.startTime,format);
            tempParam.endTime = CoreService.dateFormat(date.endTime,format);
        }
      }else{
        //未选择账期时,默认以通用方式处理
        tempParam.startTime = CoreService.dateFormat(date.startTime,format);
        tempParam.endTime = CoreService.dateFormat(date.endTime,format);
      }
      return tempParam;
    }

    //初始化日期参数
    function initDateParam(){
      if(param.timeType){
        //如果选择了账期,则按账期初始化日期参数
        date = BusAssessmentService.initDate(param.timeType.timeTypeCode);
      }else{
        //如果没选择账期,则按账期为日初始化日期参数
        date = BusAssessmentService.initDate('1');
      }
      return date;
    }

    //初始化页面控制标志
    function initFlag(){
      flag = {
        //表单是否收拢
        formIsFold:false,
        //是否展示列表
        showTable:false,
        flag: ''
      };
      return flag;
    }

    //检测数据是否为空不可用
    function checkData(data){
      //默认数据不可用
      var isNull = true;
      //是否是数组
      var isArray = is.array(data);

      //若数据不是数组,则返回数据不可用
      if(!isArray||data.length === 0) return isNull;
      //迭代数据数组
      angular.forEach(data,function(item){
        //存在数组元素中业务联不为 0 则数据可用
        if(item.tradeAmount !== 0){
          isNull = false;
        }
      })
      return isNull;
    }
  }
  upayAQueryObj.$inject = ['BusAssessmentService','CoreLoading','CoreService','UpayASelector','UpayAssessServer','UpayAViewObj','PublicFn'];

  /**
   * 页面数据对象service
   * @param   BusAssessmentService 业务侧考核service
   * @return                       service实例
   */
  function upayAViewObj(BusAssessmentService,PublicFn){
    //页面数据对象
    var viewObj = {};

    return {
      initViewObj : initViewObj,
      setSeries : setSeries,
      setExportParam : setExportParam,
      setDuration : setDuration
    };

    //初始化页面数据对象
    function initViewObj(){
      viewObj = {
        //数据集
        series:{},
        //账期区间
        duration:'',
        //导出参数
        exportParam:{}
      };
      return viewObj;
    }

    /**
     * 设置数据集
     * @param  data 响应数据集
     */
    function setSeries(data){
      //目前仅查出单条数据,所以仅取数组第一条
      viewObj.series = data[0];
      return viewObj.series;
    }

    /**
     * 设置账期区间
     * @param  param 查询参数
     */
    function setDuration(param){
      viewObj.duration = BusAssessmentService.getDuration(param);
      return viewObj.duration;
    }

    /**
     * 设置导出参数
     * @param  param 查询参数
     */
    function setExportParam(param){
      //导出参数
      viewObj.exportParam = param;
      //向导出参数中加入账期区间
      viewObj.exportParam.duration = viewObj.duration;
      //向导出参数中加入列表标题
      viewObj.exportParam.title = PublicFn.fmtDateTitle(param,'timeType')+'考核区间内统一支付考核得分';
      return viewObj.exportParam;
    }
  }
  upayAViewObj.$inject = ['BusAssessmentService','PublicFn'];
})();
